package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 排序自定义类型元素的集合
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(1,2));
        list.add(new Point(9,8));
        list.add(new Point(12,27));
        list.add(new Point(189,12));
        list.add(new Point(1,6));
        System.out.println(list);
        /*
            sort方法要求集合元素必须实现:Comparable接口
            compare:比较

            侵入性:当我们调用某个API功能时，其还要求我们为其修改额外地方的代码，这样的现象
            成为侵入性。
            侵入性不利于后期项目的维护，因此要尽量避免
         */
//        Collections.sort(list);//具有侵入性

//        MyComparator comparator = new MyComparator();
//        Collections.sort(list,comparator);


        //匿名内部类形式创建比较器
       /* Comparator<Point> comparator = new Comparator<Point>() {
            public int compare(Point o1, Point o2) {
                int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return olen1-olen2;
            }
        };
        Collections.sort(list,comparator);*/


        //一句话，没有侵入性写法
        Collections.sort(list,new Comparator<Point>() {
            public int compare(Point o1, Point o2) {
                int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return olen1-olen2;
            }
        });


        System.out.println(list);
    }
}

/*class MyComparator implements Comparator<Point>{
    *//**
     * 该方法用于定义o1与o2的比较大小的规则
     * @param o1    参与比较的元素1
     * @param o2    参与比较的元素2
     * @return      用一个数字表示o1与o2比较大小的结果
     *              返回值>0:o1>o2
     *              返回值<0:o1<o2
     *              返回值=0:o1=o2
     *//*
    public int compare(Point o1, Point o2) {
        int olen1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
        int olen2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
        return olen1-olen2;
    }
}*/

